//Copyright (c) 2006-2007 Microsoft Corporation.  All rights reserved
using System;

using InvocationFramework.Common.Interfaces;

namespace InvocationFramework.Core.ProxyFactory
{
    /// <summary>
    /// Esta clase permite generar proxies automaticos a servicios
    /// </summary>
    /// <typeparam name="T">Tipo del proxy que se quiere construir</typeparam>
    /// <author>Rodolfo Finochietti 03/02/2006 23.25</author>
    public class ServiceProxyBuilder<T> where T : class
    {
        #region Constructors

        /// <summary>
        /// Constructor
        /// </summary>
        public ServiceProxyBuilder( ) : this( typeof( T ).Name ) { }
        
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="serviceName">Nombre del servicio que se quiere invocar con el proxy generado</param>
        public ServiceProxyBuilder( string serviceName )
        {
            _serviceName = serviceName;
            _proxyGenerator = new RemotingProxyGenerator( );
        }

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="serviceName">Nombre del servicio que se quiere invocar con el proxy generado</param>
        /// <param name="proxyGenerator">Estrategia de generacion de proxies a utilizar</param>
        public ServiceProxyBuilder( string serviceName, IProxyGenerator proxyGenerator )
        {
            _serviceName = serviceName;
            _proxyGenerator = proxyGenerator;
        }

        #endregion

        #region Properties
        
        /// <summary>
        /// Variable privada para el manejo de la propiedad
        /// </summary>
        private string _serviceName;

        /// <summary>
        /// Nombre del servicio que se quiere invocar con el proxy generado
        /// </summary>
        public string ServiceName
        {
            get
            {
                return _serviceName;
            }
            set
            {
                _serviceName = value;
            }
        }

        /// <summary>
        /// Variable privada para el manejo de la propiedad
        /// </summary>
        private IProxyGenerator _proxyGenerator;

        /// <summary>
        /// Estrategia de generacion de proxies a utilizar
        /// </summary>
        public IProxyGenerator ProxyGenerator
        {
            get
            {
                return _proxyGenerator;
            }
            set
            {
                _proxyGenerator = value;
            }
        }

        #endregion        

        #region Public Methods
        
        /// <summary>
        /// Construye el proxy
        /// </summary>
        /// <returns>Un proxy del tipo especificado en la creacion de ServiceProxyBuilder</returns>
        public T BuildProxy( )
        {
            //Creo el proxy usando la estrategia que me asignaron al momento de la creacion
            return _proxyGenerator.BuildProxy<T>( _serviceName );
        }
        
        #endregion
    }
}